﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;
using VisionEstereo.SegmentacionColores;



namespace VisionEstereo.AlgoritmoCorrelacion
{
    public partial class ResultadosCorrelacion
    {
        private System.Drawing.Bitmap disparidades;
        private int disparidadMaxima;
        private int disparidadMedia;
        private App.TipoAlgoritmo tipoAlgoritmo;
        private bool segmentacion = false;
        private int[,] matrizClases;
        private ArrayList listaClases;
        private int ancho, alto;
        public PixelDato[] coloresClases;
        private int[,] mapaDisp;


        public ResultadosCorrelacion()
        {
            this.InitializeComponent();

        }
        public void setCorrelacionColores(bool b)
        {
            segmentacion = b;
        }
        public void setMapaDisparidades(int[,] aux)
        {
            mapaDisp = aux;
        }

        public void setImagenResultado(BitmapSource resultado)
        {
            this.imgResultado.Source = resultado;
        }

        public void setImagenInicial(System.Drawing.Bitmap bitmapIzquierda)
        {
            System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmapIzquierda.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
            this.imagenInicial.Source = bitmapSource;
        }

        public void setTipoAlgoritmo(App.TipoAlgoritmo tipoAlgoritmo)
        {
            this.tipoAlgoritmo = tipoAlgoritmo;
        }

        public void setColoresClases()
        {
            Clase obj;
            int cont = 0;
            coloresClases = new PixelDato[listaClases.Count];
            IEnumerator objMyEnum = listaClases.GetEnumerator();
            while (objMyEnum.MoveNext())
            {
                obj = (Clase)objMyEnum.Current;
                this.coloresClases[cont] = obj.getCentro();
                cont++;
            }
        }


        /// <summary>
        /// Este método almacena un Bitmap de disparidades, para
        /// poder visualizar los datos al hacer clic sobre cada píxel.
        /// </summary>
        /// <param name="disparidades">Matriz de disparidades</param>
        public void setImagenDisparidades(System.Drawing.Bitmap disparidades)
        {
            this.disparidades = disparidades;
        }
        //----copiamos matriz de clases--------//
        public void setImagenClases(int[,] m)
        {
            this.matrizClases = m;
        }

        public void setListaClases(ArrayList lista)
        {
            this.listaClases = lista;
        }
        public void setTiempo(String tiempo)
        {
            this.labelTime.Content = "Tiempo: " + tiempo;
        }
        private void setLabelCoordenadas(Point punto)
        {
            int x = (int)punto.X;
            int y = (int)punto.Y;
            this.labelCoordenadas.Content = String.Format("Coordenadas: X = {0} Y = {1}", x, y);
        }

        private void setLabelDisparidad(int disparidad)
        {
           this.Disparidad.Content = String.Format("Disparidad: {0}", disparidad);
        }

        public void setDisparidadesMaximaYMedia(int disparidadMaxima, int disparidadMedia)
        {
            this.disparidadMaxima = disparidadMaxima;
            this.disparidadMedia = disparidadMedia;
        }

        private void botonHome_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            PantallaInicial pagInicio = new PantallaInicial();
            this.NavigationService.Navigate(pagInicio);
        }

        private void imgResultado_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            setLabelCoordenadas(e.GetPosition(imgResultado));
        }

        public void setTamañoImagenReal(int x, int y)
        {
            ancho = x;
            alto = y;
        }


        private void imgResultado_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            //----------------correlación--------------//
            
                int x = (int)e.GetPosition(imgResultado).X;
                int y = (int)e.GetPosition(imgResultado).Y;

                int with = (int)((x * ancho) / imgResultado.ActualWidth);
                int height = (int)((y * alto) / imgResultado.ActualHeight);

                int dis = (int)mapaDisp.GetValue(with, height);
                setLabelDisparidad(dis);           
        }

        
        private void BotonGuardar_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog dialogoGuardar = new SaveFileDialog();
            dialogoGuardar.Filter = "Archivos de imagen|*.jpg;*.png;*.bmp";
            dialogoGuardar.Title = "Elija dónde guardar su imagen";

            if (dialogoGuardar.ShowDialog() == DialogResult.OK && dialogoGuardar.FileName != "")
            {
                //guaradamos bitMap
                BitmapSource bitmap = imgResultado.Source as BitmapSource;
                if (bitmap != null)
                {
                    JpegBitmapEncoder jpeg = new JpegBitmapEncoder();
                    jpeg.Frames.Add(BitmapFrame.Create(bitmap));
                    using (Stream stm = File.Create(dialogoGuardar.FileName))
                    {
                        jpeg.Save(stm);
                    }
                }
                
            }
        }


        int max(int a, int b) { if (a > b) return a; return b; }
        int min(int a, int b) { if (a < b) return a; return b; }
    }
}




